
/*
 *
 *  Copyright (C) 2012-2024
 *  All rights reserved, Designed By 杭州连线客信息技术有限公司
 *  注意：
 *  本软件为杭州连线客信息技术有限公司开发研制，未经购买不得使用
 *  购买后可获得全部源代码（禁止转卖、分享、上传到码云、github等开源平台）
 *  一经发现盗用、分享等行为，将追究法律责任，后果自负
 *
 */

package com.lxk.finance.service;

import com.lxk.finance.domain.bo.AccUserAccountBo;
import com.lxk.finance.domain.bo.AccUserWithdrawalBo;
import com.lxk.finance.domain.bo.UserApplyBo;
import com.lxk.finance.domain.vo.AccUserWithdrawalVo;
import com.lxk.finance.enums.AccEnums;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 用户提现Service接口
 *
 * @author LXK-RY5
 * @date 2024-10-09
 */
public interface IAccUserWithdrawalService {

    /**
     * 审核
     *
     * @param id
     * @param dst
     * @param auditId
     * @param remark
     * @return
     */
    Boolean audit(Long id, AccEnums.AuditStatus dst, Long auditId, String remark);

    /**
     * 更新审核状态
     *
     * @param id
     * @param srcStatus
     * @param dstStatus
     * @param remark
     * @return
     */
    Boolean updateByAuditStatus(Long id, Integer srcStatus, Integer dstStatus, Long auditId, String remark);

    /**
     * 申请提现
     *
     * @param apply
     * @return
     */
    Boolean applyWithdrawal(UserApplyBo apply);

    /**
     * 申请提现微信
     *
     * @param userId
     * @param amount
     * @param wxOpenId       不为空
     * @param serviceFeeRate 手续费 如0.1 即10%
     * @param remark
     * @return
     */
    Boolean applyForWx(Long userId, String userType, BigDecimal amount, BigDecimal serviceFeeRate, AccUserAccountBo.AccountType accountType, String wxOpenId, String remark);

    /**
     * 查询IdList用户提现Map
     */
    Map<Long, AccUserWithdrawalVo> queryMapByIdList(List<Long> idList);

    /**
     * 用户提现ListVo转Map
     */
    default Map<Long, AccUserWithdrawalVo> convertToMap(List<AccUserWithdrawalVo> list) {
        return list.stream().collect(Collectors.toMap(AccUserWithdrawalVo::getId, v -> v));
    }

    /**
     * 查询用户提现Map
     */
    Map<Long, AccUserWithdrawalVo> queryMap(AccUserWithdrawalBo bo);

    /**
     * 查询用户提现IdList
     */
    List<AccUserWithdrawalVo> queryByIdList(List<Long> idList);

    /**
     * 查询用户提现
     *
     * @param id 主键
     * @return 用户提现
     */
    AccUserWithdrawalVo queryById(Long id);

    /**
     * 分页查询用户提现列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 用户提现分页列表
     */
    TableDataInfo<AccUserWithdrawalVo> queryPageList(AccUserWithdrawalBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的用户提现列表
     *
     * @param bo 查询条件
     * @return 用户提现列表
     */
    List<AccUserWithdrawalVo> queryList(AccUserWithdrawalBo bo);

    /**
     * 新增用户提现
     *
     * @param bo 用户提现
     * @return 是否新增成功
     */
    Boolean insertByBo(AccUserWithdrawalBo bo);

    /**
     * 修改用户提现
     *
     * @param bo 用户提现
     * @return 是否修改成功
     */
    Boolean updateByBo(AccUserWithdrawalBo bo);

    /**
     * 校验并批量删除用户提现信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
